Index: main/plugin-survey/i18n/messages_en.xml
===================================================================
--- main/plugin-survey/i18n/messages_en.xml	(revision 45795)
+++ main/plugin-survey/i18n/messages_en.xml	(working copy)
@@ -287,6 +287,10 @@
    	<message key="PLUGINS_SURVEY_DIALOG_SURVEY_LABEL_DEFAULT">Survey</message>
    	<message key="PLUGINS_SURVEY_DIALOG_SURVEY_TITLE">Survey title</message>
    	<message key="PLUGINS_SURVEY_DIALOG_SURVEY_TITLE_DESC">Survey title (optionnel)</message>
+   	<message key="PLUGINS_SURVEY_DIALOG_PICTURE_LABEL">Picture</message>
+    <message key="PLUGINS_SURVEY_DIALOG_PICTURE_DESC">Survey's picture</message>
+    <message key="PLUGINS_SURVEY_DIALOG_PICTURE_ALT_LABEL">Alternative text</message>
+    <message key="PLUGINS_SURVEY_DIALOG_PICTURE_ALT_DESC">Alternative text of the picture</message>
    	<message key="PLUGINS_SURVEY_DIALOG_SURVEY_DESCRIPTION">Start message</message>
    	<message key="PLUGINS_SURVEY_DIALOG_SURVEY_DESCRIPTION_DESC">Message or note to be displayed at the beginning of the survey (optionnel)</message>
    	<message key="PLUGINS_SURVEY_DIALOG_SURVEY_ENDING_MESSAGE">Ending message</message>
@@ -299,6 +303,10 @@
    	<message key="PLUGINS_SURVEY_DIALOG_PAGE_LABEL_DESC">Short name (the short name is not displayed in survey)</message>
    	<message key="PLUGINS_SURVEY_DIALOG_PAGE_TITLE">Page title</message>
    	<message key="PLUGINS_SURVEY_DIALOG_PAGE_TITLE_DESC">Page title</message>
+   	<message key="PLUGINS_SURVEY_DIALOG_PAGE_PICTURE_LABEL">Picture</message>
+    <message key="PLUGINS_SURVEY_DIALOG_PAGE_PICTURE_DESC">Page's picture</message>
+    <message key="PLUGINS_SURVEY_DIALOG_PAGE_PICTURE_ALT_LABEL">Alternative text</message>
+    <message key="PLUGINS_SURVEY_DIALOG_PAGE_PICTURE_ALT_DESC">Alternative text of the picture</message>
    	<message key="PLUGINS_SURVEY_DIALOG_PAGE_DESCRIPTION">Note or header</message>
    	<message key="PLUGINS_SURVEY_DIALOG_PAGE_DESCRIPTION_DESC">Note or header</message>
    	<message key="PLUGINS_SURVEY_DIALOG_BUTTON_OK">Ok</message>
@@ -311,6 +319,10 @@
    	<message key="PLUGINS_SURVEY_DIALOG_QUESTION_LABEL_DEFAULT">Question</message>
    	<message key="PLUGINS_SURVEY_DIALOG_QUESTION_TITLE">Question</message>
    	<message key="PLUGINS_SURVEY_DIALOG_QUESTION_TITLE_DESC">Question title</message>
+    <message key="PLUGINS_SURVEY_DIALOG_QUESTION_PICTURE_LABEL">Picture</message>
+    <message key="PLUGINS_SURVEY_DIALOG_QUESTION_PICTURE_DESC">Question's picture</message>
+    <message key="PLUGINS_SURVEY_DIALOG_QUESTION_ALT_LABEL">Alternative text</message>
+    <message key="PLUGINS_SURVEY_DIALOG_QUESTION_ALT_DESC">Alternative text of the picture</message>
    	<message key="PLUGINS_SURVEY_DIALOG_QUESTION_MANDATORY">Mandatory</message>
    	<message key="PLUGINS_SURVEY_DIALOG_QUESTION_MANDATORY_DESC">Check thsi case if this question is mandatory</message>
    	<message key="PLUGINS_SURVEY_DIALOG_QUESTION_MULTIPLE">Multiple choice</message>
Index: main/plugin-survey/i18n/messages_fr.xml
===================================================================
--- main/plugin-survey/i18n/messages_fr.xml	(revision 45795)
+++ main/plugin-survey/i18n/messages_fr.xml	(working copy)
@@ -286,6 +286,10 @@
    	<message key="PLUGINS_SURVEY_DIALOG_SURVEY_LABEL_DEFAULT">Enquête</message>
    	<message key="PLUGINS_SURVEY_DIALOG_SURVEY_TITLE">Titre de l'enquête</message>
    	<message key="PLUGINS_SURVEY_DIALOG_SURVEY_TITLE_DESC">Titre de l'enquête (optionnel)</message>
+   	<message key="PLUGINS_SURVEY_DIALOG_PICTURE_LABEL">Illustration</message>
+    <message key="PLUGINS_SURVEY_DIALOG_PICTURE_DESC">Illustration de l'enquête</message>
+    <message key="PLUGINS_SURVEY_DIALOG_PICTURE_ALT_LABEL">Texte alternatif</message>
+    <message key="PLUGINS_SURVEY_DIALOG_PICTURE_ALT_DESC">Texte alternatif de l'illustration</message>
    	<message key="PLUGINS_SURVEY_DIALOG_SURVEY_DESCRIPTION">Message de début</message>
    	<message key="PLUGINS_SURVEY_DIALOG_SURVEY_DESCRIPTION_DESC">Message ou note explicative à afficher au début de l'enquête (optionnel)</message>
    	<message key="PLUGINS_SURVEY_DIALOG_SURVEY_ENDING_MESSAGE">Message de fin</message>
@@ -298,6 +302,10 @@
    	<message key="PLUGINS_SURVEY_DIALOG_PAGE_LABEL_DESC">Nom de la page (le nom court n'est pas affiché dans l'enquête)</message>
    	<message key="PLUGINS_SURVEY_DIALOG_PAGE_TITLE">Titre de la page</message>
    	<message key="PLUGINS_SURVEY_DIALOG_PAGE_TITLE_DESC">Titre de la page</message>
+   	<message key="PLUGINS_SURVEY_DIALOG_PAGE_PICTURE_LABEL">Illustration</message>
+    <message key="PLUGINS_SURVEY_DIALOG_PAGE_PICTURE_DESC">Illustration de la page</message>
+    <message key="PLUGINS_SURVEY_DIALOG_PAGE_PICTURE_ALT_LABEL">Texte alternatif</message>
+    <message key="PLUGINS_SURVEY_DIALOG_PAGE_PICTURE_ALT_DESC">Texte alternatif de l'illustration</message>
    	<message key="PLUGINS_SURVEY_DIALOG_PAGE_DESCRIPTION">Note ou entête</message>
    	<message key="PLUGINS_SURVEY_DIALOG_PAGE_DESCRIPTION_DESC">Note ou entête de la page</message>
    	<message key="PLUGINS_SURVEY_DIALOG_BUTTON_OK">Ok</message>
@@ -310,6 +318,10 @@
    	<message key="PLUGINS_SURVEY_DIALOG_QUESTION_LABEL_DEFAULT">Question</message>
    	<message key="PLUGINS_SURVEY_DIALOG_QUESTION_TITLE">Question</message>
    	<message key="PLUGINS_SURVEY_DIALOG_QUESTION_TITLE_DESC">Intitulé de la question</message>
+   	<message key="PLUGINS_SURVEY_DIALOG_QUESTION_PICTURE_LABEL">Illustration</message>
+    <message key="PLUGINS_SURVEY_DIALOG_QUESTION_PICTURE_DESC">Illustration de la question</message>
+    <message key="PLUGINS_SURVEY_DIALOG_QUESTION_PICTURE_ALT_LABEL">Texte alternatif</message>
+    <message key="PLUGINS_SURVEY_DIALOG_QUESTION_PICTURE_ALT_DESC">Texte alternatif de l'illustration</message>
    	<message key="PLUGINS_SURVEY_DIALOG_QUESTION_MANDATORY">Obligatoire</message>
    	<message key="PLUGINS_SURVEY_DIALOG_QUESTION_MANDATORY_DESC">Cochez cette case si cette question est obligatoire</message>
    	<message key="PLUGINS_SURVEY_DIALOG_QUESTION_MULTIPLE">Choix multiple</message>
Index: main/plugin-survey/nodetypes/survey_nodetypes.xml
===================================================================
--- main/plugin-survey/nodetypes/survey_nodetypes.xml	(revision 45795)
+++ main/plugin-survey/nodetypes/survey_nodetypes.xml	(working copy)
@@ -31,6 +31,14 @@
         <propertyDefinition name="ametys-internal:redirection" requiredType="String" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" multiple="false"/>
        	<propertyDefinition name="ametys-internal:private" requiredType="Boolean" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" multiple="false"/>
        	<propertyDefinition name="ametys-internal:grantedUsers" requiredType="String" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" multiple="true"/>
+        <propertyDefinition name="ametys-internal:picture-type" requiredType="String" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" multiple="false"/>
+        <propertyDefinition name="ametys-internal:picture-id" requiredType="String" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" multiple="false"/>
+        <propertyDefinition name="ametys-internal:picture-alternative" requiredType="String" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" multiple="false"/>
+        <childNodeDefinition name="ametys-internal:picture" defaultPrimaryType="ametys:binaryMetadata" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" sameNameSiblings="false">
+            <requiredPrimaryTypes>
+                <requiredPrimaryType>ametys:binaryMetadata</requiredPrimaryType>
+            </requiredPrimaryTypes>
+        </childNodeDefinition>
         <childNodeDefinition name="*" defaultPrimaryType="ametys:survey-page" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" sameNameSiblings="false">
             <requiredPrimaryTypes>
                 <requiredPrimaryType>ametys:survey-page</requiredPrimaryType>
@@ -45,6 +53,14 @@
         <propertyDefinition name="ametys-internal:label" requiredType="String" autoCreated="false" mandatory="true" onParentVersion="COPY" protected="false" multiple="false"/>
         <propertyDefinition name="ametys-internal:title" requiredType="String" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" multiple="false"/>
         <propertyDefinition name="ametys-internal:description" requiredType="String" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" multiple="false"/>
+        <propertyDefinition name="ametys-internal:picture-type" requiredType="String" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" multiple="false"/>
+        <propertyDefinition name="ametys-internal:picture-id" requiredType="String" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" multiple="false"/>
+        <propertyDefinition name="ametys-internal:picture-alternative" requiredType="String" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" multiple="false"/>
+        <childNodeDefinition name="ametys-internal:picture" defaultPrimaryType="ametys:binaryMetadata" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" sameNameSiblings="false">
+            <requiredPrimaryTypes>
+                <requiredPrimaryType>ametys:binaryMetadata</requiredPrimaryType>
+            </requiredPrimaryTypes>
+        </childNodeDefinition>
         <childNodeDefinition name="ametys-internal:rule" defaultPrimaryType="ametys:survey-rule" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" sameNameSiblings="false">
             <requiredPrimaryTypes>
                 <requiredPrimaryType>ametys:survey-rule</requiredPrimaryType>
@@ -64,6 +80,14 @@
         <propertyDefinition name="ametys-internal:label" requiredType="String" autoCreated="false" mandatory="true" onParentVersion="COPY" protected="false" multiple="false"/>
         <propertyDefinition name="ametys-internal:title" requiredType="String" autoCreated="false" mandatory="true" onParentVersion="COPY" protected="false" multiple="false"/>
         <propertyDefinition name="ametys-internal:regexp" requiredType="String" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" multiple="false"/>
+        <propertyDefinition name="ametys-internal:picture-type" requiredType="String" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" multiple="false"/>
+        <propertyDefinition name="ametys-internal:picture-id" requiredType="String" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" multiple="false"/>
+        <propertyDefinition name="ametys-internal:picture-alternative" requiredType="String" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" multiple="false"/>
+        <childNodeDefinition name="ametys-internal:picture" defaultPrimaryType="ametys:binaryMetadata" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" sameNameSiblings="false">
+            <requiredPrimaryTypes>
+                <requiredPrimaryType>ametys:binaryMetadata</requiredPrimaryType>
+            </requiredPrimaryTypes>
+        </childNodeDefinition>
         <childNodeDefinition name="ametys-internal:options" defaultPrimaryType="ametys:survey-options" autoCreated="true" mandatory="false" onParentVersion="COPY" protected="false" sameNameSiblings="false">
             <requiredPrimaryTypes>
                 <requiredPrimaryType>ametys:survey-options</requiredPrimaryType>
Index: main/plugin-survey/resources/js/org/ametys/survey/SurveyAction.i18n.js
===================================================================
--- main/plugin-survey/resources/js/org/ametys/survey/SurveyAction.i18n.js	(revision 45795)
+++ main/plugin-survey/resources/js/org/ametys/survey/SurveyAction.i18n.js	(working copy)
@@ -349,6 +349,8 @@
 	    form.findField('label').focus(true);
 	    form.findField('label').clearInvalid();
 	    form.findField('title').setValue('');
+	    form.findField('picture').setValue(null);
+	    form.findField('picture-alternative').setValue('');
 	    form.findField('description').setValue('');
 	    form.findField('endingMessage').setValue('');
 	    form.findField('private').setValue(false);
@@ -379,13 +381,47 @@
 		var description = response.selectSingleNode('survey/description') != null ? response.selectSingleNode('survey/description')[org.ametys.servercomm.ServerComm.xmlTextContent] : '';
 		var endingMessage = response.selectSingleNode('survey/endingMessage') != null ? response.selectSingleNode('survey/endingMessage')[org.ametys.servercomm.ServerComm.xmlTextContent] : '';
 		var isPrivate = response.selectSingleNode('survey').getAttribute('private') == 'true';
-	    
-	    form.findField('id').setValue(id);
+		var picAlternative = response.selectSingleNode('survey/pictureAlternative') != null ? response.selectSingleNode('survey/pictureAlternative')[org.ametys.servercomm.ServerComm.xmlTextContent] : '';
+
+		form.findField('id').setValue(id);
 	    form.findField('title').setValue(title);
 	    form.findField('label').setValue(label);
 	    form.findField('description').setValue(description);
 	    form.findField('endingMessage').setValue(endingMessage);
 	    form.findField('private').setValue(isPrivate);
+	    form.findField('picture-alternative').setValue(picAlternative);
+	    
+	    var pictureNode = response.selectSingleNode('survey/picture');
+		if (pictureNode != null)
+		{
+			var picType = pictureNode.getAttribute("pictureType");
+			if (picType == 'resource')
+			{
+				var resourceId = pictureNode.getAttribute('pictureId');
+				var picName = pictureNode.getAttribute('pictureName') || '';
+				var picSize = pictureNode.getAttribute('pictureSize') || '';
+				
+				var viewHref = org.ametys.web.helper.ChooseResourcesFile.getViewHref(resourceId); 
+				var downloadHref = org.ametys.web.helper.ChooseResourcesFile.getDownloadHref(resourceId);
+				
+				form.findField('picture').setFileValue('untouched', picName, picSize, viewHref, downloadHref, 'resource');
+			}
+			else if (picType == 'external')
+			{
+				var picPath = pictureNode.getAttribute('picturePath') || '';
+				var picName = pictureNode.getAttribute('pictureName') || '';
+				var picSize = pictureNode.getAttribute('pictureSize') || '';
+				
+				var viewHref = org.ametys.cms.utils.ResourcesUtility.getViewHref(id, picPath);
+				var downloadHref = org.ametys.cms.utils.ResourcesUtility.getDownloadHref(id, picPath);
+				
+				form.findField('picture').setFileValue('untouched', picName, picSize, viewHref, downloadHref, 'external');
+			}
+			else
+			{
+				form.findField('picture').setValue(null);
+			}
+		}
 	}
 }
 
@@ -420,6 +456,19 @@
 					 desc: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_SURVEY_TITLE_DESC"/>",
 				     width: 350
 				 }),
+				 new org.ametys.web.widgets.ExternalOrResourceImagesWidget({
+	                 name: 'picture',
+	                 fieldLabel: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_PICTURE_LABEL"/>",
+	                 desc: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_PICTURE_DESC"/>",
+	                 width: 350,
+	                 labelStyle: "height: 100px;"
+	             }),
+	             new org.ametys.form.TextField({
+	                 name: 'picture-alternative',
+	                 fieldLabel: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_PICTURE_ALT_LABEL"/>",
+	                 desc: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_PICTURE_ALT_DESC"/>",
+	                 width: 350
+	             }),
 				 new org.ametys.form.TextAreaField ({
 					 name: 'description',
 					 fieldLabel: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_SURVEY_DESCRIPTION"/>",
@@ -450,8 +499,8 @@
 		icon : getPluginResourcesUrl(org.ametys.survey.Survey.pluginName) + "/img/survey/survey_16.png",
 		
 		layout :'fit',
-		width : 550,
-		height : 440,
+		width : 570,
+		height : 600,
 		
 		items : [ formPanel ],
 		
@@ -814,6 +863,8 @@
 		form.findField('title').setValue('');
 	    form.findField('description').setValue('');
 	    form.findField('surveyId').setValue(surveyID);
+	    form.findField('picture').setValue(null);
+	    form.findField('picture-alternative').setValue('');
 	}
 	else
 	{
@@ -846,12 +897,46 @@
 		var label = response.selectSingleNode('page/label')[org.ametys.servercomm.ServerComm.xmlTextContent];
 		var title = response.selectSingleNode('page/title')[org.ametys.servercomm.ServerComm.xmlTextContent];
 		var description = response.selectSingleNode('page/description')[org.ametys.servercomm.ServerComm.xmlTextContent];
+		var picAlternative = response.selectSingleNode('page/pictureAlternative') != null ? response.selectSingleNode('page/pictureAlternative')[org.ametys.servercomm.ServerComm.xmlTextContent] : '';
 	    
 		var form = org.ametys.survey.Page._form;
 	    form.findField('id').setValue(id);
 	    form.findField('label').setValue(label);
 	    form.findField('title').setValue(title);
 	    form.findField('description').setValue(description);
+	    form.findField('picture-alternative').setValue(picAlternative);
+	    
+	    var pictureNode = response.selectSingleNode('page/picture');
+		if (pictureNode != null)
+		{
+			var picType = pictureNode.getAttribute("pictureType");
+			if (picType == 'resource')
+			{
+				var resourceId = pictureNode.getAttribute('pictureId');
+				var picName = pictureNode.getAttribute('pictureName') || '';
+				var picSize = pictureNode.getAttribute('pictureSize') || '';
+				
+				var viewHref = org.ametys.web.helper.ChooseResourcesFile.getViewHref(resourceId); 
+				var downloadHref = org.ametys.web.helper.ChooseResourcesFile.getDownloadHref(resourceId);
+				
+				form.findField('picture').setFileValue('untouched', picName, picSize, viewHref, downloadHref, 'resource');
+			}
+			else if (picType == 'external')
+			{
+				var picPath = pictureNode.getAttribute('picturePath') || '';
+				var picName = pictureNode.getAttribute('pictureName') || '';
+				var picSize = pictureNode.getAttribute('pictureSize') || '';
+				
+				var viewHref = org.ametys.cms.utils.ResourcesUtility.getViewHref(id, picPath);
+				var downloadHref = org.ametys.cms.utils.ResourcesUtility.getDownloadHref(id, picPath);
+				
+				form.findField('picture').setFileValue('untouched', picName, picSize, viewHref, downloadHref, 'external');
+			}
+			else
+			{
+				form.findField('picture').setValue(null);
+			}
+		}
 	}
 }
 
@@ -889,6 +974,19 @@
 					 desc: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_PAGE_TITLE_DESC"/>",
 				     width: 350
 				 }),
+				 new org.ametys.web.widgets.ExternalOrResourceImagesWidget({
+	                 name: 'picture',
+	                 fieldLabel: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_PAGE_PICTURE_LABEL"/>",
+	                 desc: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_PAGE_PICTURE_DESC"/>",
+	                 width: 350,
+	                 labelStyle: "height: 100px;"
+	             }),
+	             new org.ametys.form.TextField({
+	                 name: 'picture-alternative',
+	                 fieldLabel: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_PAGE_PICTURE_ALT_LABEL"/>",
+	                 desc: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_PAGE_PICTURE_ALT_DESC"/>",
+	                 width: 350
+	             }),
 				 new org.ametys.form.TextAreaField ({
 					 name: 'description',
 					 fieldLabel: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_PAGE_DESCRIPTION"/>",
@@ -906,8 +1004,8 @@
 		icon : getPluginResourcesUrl(org.ametys.survey.Page.pluginName) + "/img/pages/page_16.png",
 		
 		layout :'fit',
-		width : 550,
-		height : 270,
+		width : 570,
+		height : 430,
 		
 		items : [ formPanel ],
 		
Index: main/plugin-survey/resources/js/org/ametys/survey/questions/InputChoices.i18n.js
===================================================================
--- main/plugin-survey/resources/js/org/ametys/survey/questions/InputChoices.i18n.js	(revision 45795)
+++ main/plugin-survey/resources/js/org/ametys/survey/questions/InputChoices.i18n.js	(working copy)
@@ -58,6 +58,8 @@
 		form.findField('mandatory').setValue(false);
 		form.findField('multiple').setValue(false);
 		form.findField('other-option').setValue(false);
+		form.findField('picture').setValue(null);
+	    form.findField('picture-alternative').setValue('');
 		
 		org.ametys.survey.question.InputChoices._load('');
 	}
@@ -80,6 +82,7 @@
 		var title = response.selectSingleNode('question/title')[org.ametys.servercomm.ServerComm.xmlTextContent];
 		var label = response.selectSingleNode('question/label')[org.ametys.servercomm.ServerComm.xmlTextContent];
 		var mandatory = response.selectSingleNode('question').getAttribute('mandatory') == 'true';
+		var picAlternative = response.selectSingleNode('question/pictureAlternative') != null ? response.selectSingleNode('question/pictureAlternative')[org.ametys.servercomm.ServerComm.xmlTextContent] : '';
 		var modifiable = response.selectSingleNode('question').getAttribute('modifiable') == 'true';
 		var type = response.selectSingleNode('question').getAttribute('type');
 		var multiple = type == 'MULTIPLE_CHOICE';
@@ -94,7 +97,40 @@
 	    form.findField('multiple').setValue(multiple);
 	    form.findField('other-option').setValue(other);
 	    form.findField('other-option').setDisabled(!modifiable);
+	    form.findField('picture-alternative').setValue(picAlternative);
 	    
+	    var pictureNode = response.selectSingleNode('question/picture');
+		if (pictureNode != null)
+		{
+			var picType = pictureNode.getAttribute("pictureType");
+			if (picType == 'resource')
+			{
+				var resourceId = pictureNode.getAttribute('pictureId');
+				var picName = pictureNode.getAttribute('pictureName') || '';
+				var picSize = pictureNode.getAttribute('pictureSize') || '';
+				
+				var viewHref = org.ametys.web.helper.ChooseResourcesFile.getViewHref(resourceId); 
+				var downloadHref = org.ametys.web.helper.ChooseResourcesFile.getDownloadHref(resourceId);
+				
+				form.findField('picture').setFileValue('untouched', picName, picSize, viewHref, downloadHref, 'resource');
+			}
+			else if (picType == 'external')
+			{
+				var picPath = pictureNode.getAttribute('picturePath') || '';
+				var picName = pictureNode.getAttribute('pictureName') || '';
+				var picSize = pictureNode.getAttribute('pictureSize') || '';
+				
+				var viewHref = org.ametys.cms.utils.ResourcesUtility.getViewHref(id, picPath);
+				var downloadHref = org.ametys.cms.utils.ResourcesUtility.getDownloadHref(id, picPath);
+				
+				form.findField('picture').setFileValue('untouched', picName, picSize, viewHref, downloadHref, 'external');
+			}
+			else
+			{
+				form.findField('picture').setValue(null);
+			}
+		}
+		
 	    var options = "";
 	    var optNodes = response.selectNodes('question/options/option');
     	for (var i = 0; i &lt; optNodes.length; i++)
@@ -175,7 +211,7 @@
     
 	org.ametys.survey.question.InputChoices._form = new Ext.FormPanel({
 		region: 'north',
-		height: 180,
+		height: 350,
 		labelWidth: 70,
 		bodyStyle: 'padding:10px',
 		
@@ -198,6 +234,19 @@
 				     maxLength: 20,
 				     width: 300
 				 }),
+				 new org.ametys.web.widgets.ExternalOrResourceImagesWidget({
+					 name: 'picture',
+					 fieldLabel: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_QUESTION_PICTURE_LABEL"/>",
+					 desc: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_QUESTION_PICTURE_DESC"/>",
+					 width: 300,
+					 labelStyle: "height: 100px;"
+				 }),
+				 new org.ametys.form.TextField({
+					 name: 'picture-alternative',
+					 fieldLabel: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_QUESTION_PICTURE_ALT_LABEL"/>",
+					 desc: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_QUESTION_PICTURE_ALT_DESC"/>",
+					 width: 300
+				 }),
 				 new org.ametys.form.TextField ({
 					 name: 'title',
 					 fieldLabel: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_QUESTION_TITLE"/>",
@@ -271,7 +320,7 @@
 
 		layout: 'border',
 		width: 500,
-		height: 460,
+		height: 630,
 		
 		items: [ org.ametys.survey.question.InputChoices._form,
 				 org.ametys.survey.question.InputChoices._grid
Index: main/plugin-survey/resources/js/org/ametys/survey/questions/InputText.i18n.js
===================================================================
--- main/plugin-survey/resources/js/org/ametys/survey/questions/InputText.i18n.js	(revision 45795)
+++ main/plugin-survey/resources/js/org/ametys/survey/questions/InputText.i18n.js	(working copy)
@@ -60,6 +60,8 @@
 		form.findField('multiline').setValue(false);
 		form.findField('regexp').setValue('');
 		form.findField('regexp').enable();
+		form.findField('picture').setValue(null);
+	    form.findField('picture-alternative').setValue('');
 	}
 	else
 	{
@@ -80,6 +82,7 @@
 		var title = response.selectSingleNode('question/title')[org.ametys.servercomm.ServerComm.xmlTextContent];
 		var label = response.selectSingleNode('question/label')[org.ametys.servercomm.ServerComm.xmlTextContent];
 		var mandatory = response.selectSingleNode('question').getAttribute('mandatory') == 'true';
+		var picAlternative = response.selectSingleNode('question/pictureAlternative') != null ? response.selectSingleNode('question/pictureAlternative')[org.ametys.servercomm.ServerComm.xmlTextContent] : '';
 		var regexp = response.selectSingleNode('question/regexp') != null ? response.selectSingleNode('question/regexp')[org.ametys.servercomm.ServerComm.xmlTextContent] : '';
 		var type = response.selectSingleNode('question').getAttribute('type');
 		var multiline = type == 'MULTILINE_FREE_TEXT';
@@ -93,6 +96,39 @@
 	    form.findField('multiline').setValue(multiline);
 		form.findField('regexp').setValue(regexp);
 		form.findField('regexp').setDisabled(multiline);
+		form.findField('picture-alternative').setValue(picAlternative);
+	    
+	    var pictureNode = response.selectSingleNode('question/picture');
+		if (pictureNode != null)
+		{
+			var picType = pictureNode.getAttribute("pictureType");
+			if (picType == 'resource')
+			{
+				var resourceId = pictureNode.getAttribute('pictureId');
+				var picName = pictureNode.getAttribute('pictureName') || '';
+				var picSize = pictureNode.getAttribute('pictureSize') || '';
+				
+				var viewHref = org.ametys.web.helper.ChooseResourcesFile.getViewHref(resourceId); 
+				var downloadHref = org.ametys.web.helper.ChooseResourcesFile.getDownloadHref(resourceId);
+				
+				form.findField('picture').setFileValue('untouched', picName, picSize, viewHref, downloadHref, 'resource');
+			}
+			else if (picType == 'external')
+			{
+				var picPath = pictureNode.getAttribute('picturePath') || '';
+				var picName = pictureNode.getAttribute('pictureName') || '';
+				var picSize = pictureNode.getAttribute('pictureSize') || '';
+				
+				var viewHref = org.ametys.cms.utils.ResourcesUtility.getViewHref(id, picPath);
+				var downloadHref = org.ametys.cms.utils.ResourcesUtility.getDownloadHref(id, picPath);
+				
+				form.findField('picture').setFileValue('untouched', picName, picSize, viewHref, downloadHref, 'external');
+			}
+			else
+			{
+				form.findField('picture').setValue(null);
+			}
+		}
 	}
 }
 
@@ -126,6 +162,19 @@
 				     maxLength: 20,
 				     width: 340
 				 }),
+				 new org.ametys.web.widgets.ExternalOrResourceImagesWidget({
+					 name: 'picture',
+					 fieldLabel: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_QUESTION_PICTURE_LABEL"/>",
+					 desc: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_QUESTION_PICTURE_DESC"/>",
+					 width: 340,
+					 labelStyle: "height: 100px;"
+				 }),
+				 new org.ametys.form.TextField({
+					 name: 'picture-alternative',
+					 fieldLabel: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_QUESTION_PICTURE_ALT_LABEL"/>",
+					 desc: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_QUESTION_PICTURE_ALT_DESC"/>",
+					 width: 340
+				 }),
 				 new org.ametys.form.TextField ({
 					 name: 'title',
 					 fieldLabel: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_QUESTION_TITLE"/>",
@@ -158,7 +207,7 @@
 		
 		layout :'fit',
 		width : 510,
-		height : 240,
+		height : 410,
 		
 		items : [ formPanel ],
 		
Index: main/plugin-survey/resources/js/org/ametys/survey/questions/Matrix.i18n.js
===================================================================
--- main/plugin-survey/resources/js/org/ametys/survey/questions/Matrix.i18n.js	(revision 45795)
+++ main/plugin-survey/resources/js/org/ametys/survey/questions/Matrix.i18n.js	(working copy)
@@ -58,6 +58,8 @@
 		form.findField('title').clearInvalid();
 		form.findField('mandatory').setValue(false);
 		form.findField('multiple').setValue(false);
+		form.findField('picture').setValue(null);
+	    form.findField('picture-alternative').setValue('');
 		
 		org.ametys.survey.question.Matrix._load('', '');
 	}
@@ -80,6 +82,7 @@
 		var title = response.selectSingleNode('question/title')[org.ametys.servercomm.ServerComm.xmlTextContent];
 		var label = response.selectSingleNode('question/label')[org.ametys.servercomm.ServerComm.xmlTextContent];
 		var mandatory = response.selectSingleNode('question').getAttribute('mandatory') == 'true';
+		var picAlternative = response.selectSingleNode('question/pictureAlternative') != null ? response.selectSingleNode('question/pictureAlternative')[org.ametys.servercomm.ServerComm.xmlTextContent] : '';
 		var type = response.selectSingleNode('question').getAttribute('type');
 		var multiple = type == 'MULTIPLE_MATRIX';
 		var modifiable = response.selectSingleNode('question').getAttribute('modifiable') == 'true';
@@ -91,7 +94,40 @@
 	    form.findField('label').setValue(label);
 	    form.findField('mandatory').setValue(mandatory);
 	    form.findField('multiple').setValue(multiple);
+	    form.findField('picture-alternative').setValue(picAlternative);
 	    
+	    var pictureNode = response.selectSingleNode('question/picture');
+		if (pictureNode != null)
+		{
+			var picType = pictureNode.getAttribute("pictureType");
+			if (picType == 'resource')
+			{
+				var resourceId = pictureNode.getAttribute('pictureId');
+				var picName = pictureNode.getAttribute('pictureName') || '';
+				var picSize = pictureNode.getAttribute('pictureSize') || '';
+				
+				var viewHref = org.ametys.web.helper.ChooseResourcesFile.getViewHref(resourceId); 
+				var downloadHref = org.ametys.web.helper.ChooseResourcesFile.getDownloadHref(resourceId);
+				
+				form.findField('picture').setFileValue('untouched', picName, picSize, viewHref, downloadHref, 'resource');
+			}
+			else if (picType == 'external')
+			{
+				var picPath = pictureNode.getAttribute('picturePath') || '';
+				var picName = pictureNode.getAttribute('pictureName') || '';
+				var picSize = pictureNode.getAttribute('pictureSize') || '';
+				
+				var viewHref = org.ametys.cms.utils.ResourcesUtility.getViewHref(id, picPath);
+				var downloadHref = org.ametys.cms.utils.ResourcesUtility.getDownloadHref(id, picPath);
+				
+				form.findField('picture').setFileValue('untouched', picName, picSize, viewHref, downloadHref, 'external');
+			}
+			else
+			{
+				form.findField('picture').setValue(null);
+			}
+		}
+		
 	    var options = "";
 	    var optNodes = response.selectNodes('question/options/option');
     	for (var i = 0; i &lt; optNodes.length; i++)
@@ -229,7 +265,7 @@
     
 	org.ametys.survey.question.Matrix._form = new Ext.FormPanel({
 		region: 'north',
-		height: 150,
+		height: 320,
 		labelWidth: 70,
 		bodyStyle: 'padding:10px',
 		
@@ -252,6 +288,19 @@
 				     maxLength: 20,
 				     width: 300
 				 }),
+				 new org.ametys.web.widgets.ExternalOrResourceImagesWidget({
+					 name: 'picture',
+					 fieldLabel: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_QUESTION_PICTURE_LABEL"/>",
+					 desc: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_QUESTION_PICTURE_DESC"/>",
+					 width: 300,
+					 labelStyle: "height: 100px;"
+				 }),
+				 new org.ametys.form.TextField({
+					 name: 'picture-alternative',
+					 fieldLabel: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_QUESTION_PICTURE_ALT_LABEL"/>",
+					 desc: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_QUESTION_PICTURE_ALT_DESC"/>",
+					 width: 300
+				 }),
 				 new org.ametys.form.TextField ({
 					 name: 'title',
 					 fieldLabel: "<i18n:text i18n:key="PLUGINS_SURVEY_DIALOG_QUESTION_TITLE"/>",
@@ -358,7 +407,7 @@
 
 		layout: 'border',
 		width: 500,
-		height: 450,
+		height: 620,
 		
 		items: [ org.ametys.survey.question.Matrix._form,
 		         new Ext.Panel ({
Index: main/plugin-survey/src/org/ametys/plugins/survey/actions/AbstractSurveyAction.java
===================================================================
--- main/plugin-survey/src/org/ametys/plugins/survey/actions/AbstractSurveyAction.java	(revision 45795)
+++ main/plugin-survey/src/org/ametys/plugins/survey/actions/AbstractSurveyAction.java	(working copy)
@@ -19,31 +19,49 @@
 
 import javax.jcr.RepositoryException;
 
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
 import org.apache.avalon.framework.parameters.Parameters;
 import org.apache.avalon.framework.service.ServiceException;
 import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.cocoon.Constants;
+import org.apache.cocoon.environment.Context;
 import org.apache.cocoon.environment.Redirector;
 import org.apache.cocoon.environment.SourceResolver;
 
 import org.ametys.cms.observation.AbstractNotifierAction;
 import org.ametys.plugins.repository.ModifiableTraversableAmetysObject;
 import org.ametys.plugins.repository.jcr.JCRAmetysObject;
+import org.ametys.runtime.upload.UploadManager;
 import org.ametys.web.repository.site.SiteManager;
 
 /**
  * Abstract action for manipulate survey
  *
  */
-public abstract class AbstractSurveyAction extends AbstractNotifierAction
+public abstract class AbstractSurveyAction extends AbstractNotifierAction implements Contextualizable
 {
     /** The site manager */
     protected SiteManager _siteManager;
     
+    /** The upload manager. */
+    protected UploadManager _uploadManager;
+    
+    /** The cocoon environment context. */
+    protected Context _context;
+    
+    @Override
+    public void contextualize(org.apache.avalon.framework.context.Context context) throws ContextException
+    {
+        _context = (Context) context.get(Constants.CONTEXT_ENVIRONMENT_CONTEXT);
+    }
+    
     @Override
     public void service(ServiceManager serviceManager) throws ServiceException
     {
         super.service(serviceManager);
         _siteManager = (SiteManager) serviceManager.lookup(SiteManager.ROLE);
+        _uploadManager = (UploadManager) serviceManager.lookup(UploadManager.ROLE);
     }
     
     @Override
Index: main/plugin-survey/src/org/ametys/plugins/survey/actions/AddPageAction.java
===================================================================
--- main/plugin-survey/src/org/ametys/plugins/survey/actions/AddPageAction.java	(revision 45795)
+++ main/plugin-survey/src/org/ametys/plugins/survey/actions/AddPageAction.java	(working copy)
@@ -18,17 +18,26 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
 import org.apache.avalon.framework.parameters.Parameters;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.cocoon.Constants;
+import org.apache.cocoon.environment.Context;
 import org.apache.cocoon.environment.ObjectModelHelper;
 import org.apache.cocoon.environment.Redirector;
 import org.apache.cocoon.environment.Request;
 import org.apache.cocoon.environment.SourceResolver;
+import org.apache.commons.lang.StringUtils;
 
 import org.ametys.cms.FilterNameHelper;
 import org.ametys.cms.observation.Event;
 import org.ametys.plugins.survey.SurveyEvents;
 import org.ametys.plugins.survey.repository.Survey;
 import org.ametys.plugins.survey.repository.SurveyPage;
+import org.ametys.runtime.upload.Upload;
+import org.ametys.runtime.upload.UploadManager;
 
 /** 
  * This class creates a new survey
@@ -51,6 +60,9 @@
         String title = request.getParameter("title");
         String description = request.getParameter("description");
         String originalName = FilterNameHelper.filterName(label);
+        String pictureId = request.getParameter("picture");
+        String pictureType = request.getParameter("picture#type");
+        String pictureAlternative = request.getParameter("picture-alternative");
         
         // Find unique name
         String name = originalName;
@@ -65,6 +77,28 @@
         page.setLabel(label);
         page.setDescription(description);
         
+        if (StringUtils.isEmpty(pictureId))
+        {
+            // Deletion.
+            page.setNoPicture();
+        }
+        else if (pictureType.equals("resource"))
+        {
+            page.setResourcePicture(pictureId);
+        }
+        else if (pictureType.equals("external"))
+        {
+            String login = _getCurrentUser();
+            Upload upload = _uploadManager.getUpload(login, pictureId);
+            
+            String filename = upload.getFilename();
+            String mimeType = upload.getMimeType() != null ? upload.getMimeType() : _context.getMimeType(filename);
+            String finalMimeType = mimeType != null ? mimeType : "application/unknown";
+            
+            page.setExternalPicture(finalMimeType, filename, upload.getInputStream());
+        }
+        page.setPictureAlternative(pictureAlternative);
+        
         result.put("id", page.getId());
         
         survey.saveChanges();
Index: main/plugin-survey/src/org/ametys/plugins/survey/actions/AddQuestionAction.java
===================================================================
--- main/plugin-survey/src/org/ametys/plugins/survey/actions/AddQuestionAction.java	(revision 45795)
+++ main/plugin-survey/src/org/ametys/plugins/survey/actions/AddQuestionAction.java	(working copy)
@@ -19,7 +19,13 @@
 import java.util.LinkedHashMap;
 import java.util.Map;
 
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
 import org.apache.avalon.framework.parameters.Parameters;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.cocoon.Constants;
+import org.apache.cocoon.environment.Context;
 import org.apache.cocoon.environment.ObjectModelHelper;
 import org.apache.cocoon.environment.Redirector;
 import org.apache.cocoon.environment.Request;
@@ -32,6 +38,8 @@
 import org.ametys.plugins.survey.repository.SurveyPage;
 import org.ametys.plugins.survey.repository.SurveyQuestion;
 import org.ametys.plugins.survey.repository.SurveyQuestion.QuestionType;
+import org.ametys.runtime.upload.Upload;
+import org.ametys.runtime.upload.UploadManager;
 
 /** 
  * This class creates a new question
@@ -40,6 +48,12 @@
 public class AddQuestionAction extends AbstractSurveyAction
 {
     @Override
+    public void contextualize(org.apache.avalon.framework.context.Context context) throws ContextException
+    {
+        _context = (Context) context.get(Constants.CONTEXT_ENVIRONMENT_CONTEXT);
+    }
+    
+    @Override
     public Map act(Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters parameters) throws Exception
     {
         Map<String, String> result = new HashMap<String, String>();
@@ -57,6 +71,9 @@
         String options = request.getParameter("options");
         String columns = request.getParameter("columns");
         boolean otherOption = "true".equals(request.getParameter("other-option"));
+        String pictureId = request.getParameter("picture");
+        String pictureType = request.getParameter("picture#type");
+        String pictureAlternative = request.getParameter("picture-alternative");
         
         String originalName = FilterNameHelper.filterName(label);
         
@@ -68,6 +85,29 @@
         question.setTitle(title);
         question.setMandatory(mandatory);
         question.setType(QuestionType.valueOf(type));
+        
+        if (StringUtils.isEmpty(pictureId))
+        {
+            // Deletion.
+            question.setNoPicture();
+        }
+        else if (pictureType.equals("resource"))
+        {
+            question.setResourcePicture(pictureId);
+        }
+        else if (pictureType.equals("external"))
+        {
+            String login = _getCurrentUser();
+            Upload upload = _uploadManager.getUpload(login, pictureId);
+            
+            String filename = upload.getFilename();
+            String mimeType = upload.getMimeType() != null ? upload.getMimeType() : _context.getMimeType(filename);
+            String finalMimeType = mimeType != null ? mimeType : "application/unknown";
+            
+            question.setExternalPicture(finalMimeType, filename, upload.getInputStream());
+        }
+        question.setPictureAlternative(pictureAlternative);
+        
         if (StringUtils.isNotEmpty(regexp))
         {
             question.setRegExpType(regexp);
Index: main/plugin-survey/src/org/ametys/plugins/survey/actions/CreateSurveyAction.java
===================================================================
--- main/plugin-survey/src/org/ametys/plugins/survey/actions/CreateSurveyAction.java	(revision 45795)
+++ main/plugin-survey/src/org/ametys/plugins/survey/actions/CreateSurveyAction.java	(working copy)
@@ -18,17 +18,26 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
 import org.apache.avalon.framework.parameters.Parameters;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.cocoon.Constants;
+import org.apache.cocoon.environment.Context;
 import org.apache.cocoon.environment.ObjectModelHelper;
 import org.apache.cocoon.environment.Redirector;
 import org.apache.cocoon.environment.Request;
 import org.apache.cocoon.environment.SourceResolver;
+import org.apache.commons.lang.StringUtils;
 
 import org.ametys.cms.FilterNameHelper;
 import org.ametys.cms.observation.Event;
 import org.ametys.plugins.repository.ModifiableTraversableAmetysObject;
 import org.ametys.plugins.survey.SurveyEvents;
 import org.ametys.plugins.survey.repository.Survey;
+import org.ametys.runtime.upload.Upload;
+import org.ametys.runtime.upload.UploadManager;
 
 /** 
  * This class creates a new survey
@@ -52,6 +61,9 @@
         String endingMessage = request.getParameter("endingMessage");
         String isPrivate = request.getParameter("private");
         String originalName = FilterNameHelper.filterName(label);
+        String pictureId = request.getParameter("picture");
+        String pictureType = request.getParameter("picture#type");
+        String pictureAlternative = request.getParameter("picture-alternative");
         
         ModifiableTraversableAmetysObject rootNode = getSurveyRootNode(siteName, lang);
         
@@ -70,6 +82,28 @@
         survey.setEndingMessage(endingMessage);
         survey.setPrivate("true".equals(isPrivate));
         
+        if (StringUtils.isEmpty(pictureId))
+        {
+            // Deletion.
+            survey.setNoPicture();
+        }
+        else if (pictureType.equals("resource"))
+        {
+            survey.setResourcePicture(pictureId);
+        }
+        else if (pictureType.equals("external"))
+        {
+            String login = _getCurrentUser();
+            Upload upload = _uploadManager.getUpload(login, pictureId);
+            
+            String filename = upload.getFilename();
+            String mimeType = upload.getMimeType() != null ? upload.getMimeType() : _context.getMimeType(filename);
+            String finalMimeType = mimeType != null ? mimeType : "application/unknown";
+            
+            survey.setExternalPicture(finalMimeType, filename, upload.getInputStream());
+        }
+        survey.setPictureAlternative(pictureAlternative);
+        
         result.put("id", survey.getId());
         
         rootNode.saveChanges();
Index: main/plugin-survey/src/org/ametys/plugins/survey/actions/UpdatePageAction.java
===================================================================
--- main/plugin-survey/src/org/ametys/plugins/survey/actions/UpdatePageAction.java	(revision 45795)
+++ main/plugin-survey/src/org/ametys/plugins/survey/actions/UpdatePageAction.java	(working copy)
@@ -18,15 +18,24 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
 import org.apache.avalon.framework.parameters.Parameters;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.cocoon.Constants;
+import org.apache.cocoon.environment.Context;
 import org.apache.cocoon.environment.ObjectModelHelper;
 import org.apache.cocoon.environment.Redirector;
 import org.apache.cocoon.environment.Request;
 import org.apache.cocoon.environment.SourceResolver;
+import org.apache.commons.lang.StringUtils;
 
 import org.ametys.cms.observation.Event;
 import org.ametys.plugins.survey.SurveyEvents;
 import org.ametys.plugins.survey.repository.SurveyPage;
+import org.ametys.runtime.upload.Upload;
+import org.ametys.runtime.upload.UploadManager;
 
 /**
  * Edit a page survey
@@ -46,12 +55,40 @@
         String label = request.getParameter("label");
         String title = request.getParameter("title");
         String description = request.getParameter("description");
+        String pictureId = request.getParameter("picture");
+        String pictureType = request.getParameter("picture#type");
+        String pictureAlternative = request.getParameter("picture-alternative");
         
         SurveyPage page = _resolver.resolveById(pageId);
         page.setTitle(title);
         page.setLabel(label);
         page.setDescription(description);
         
+        if (StringUtils.isEmpty(pictureId))
+        {
+            page.setNoPicture();
+        }
+        else if (pictureId.equals("untouched"))
+        {
+            // Do nothing.
+        }
+        else if (pictureType.equals("resource"))
+        {
+            page.setResourcePicture(pictureId);
+        }
+        else if (pictureType.equals("external"))
+        {
+            String login = _getCurrentUser();
+            Upload upload = _uploadManager.getUpload(login, pictureId);
+            
+            String filename = upload.getFilename();
+            String mimeType = upload.getMimeType() != null ? upload.getMimeType() : _context.getMimeType(filename);
+            String finalMimeType = mimeType != null ? mimeType : "application/unknown";
+            
+            page.setExternalPicture(finalMimeType, filename, upload.getInputStream());
+        }
+        page.setPictureAlternative(pictureAlternative);
+        
         page.saveChanges();
         
         _observationManager.notify(new Event(_getCurrentUser(), SurveyEvents.SURVEY_MODIFIED, page.getSurvey()));
Index: main/plugin-survey/src/org/ametys/plugins/survey/actions/UpdateQuestionAction.java
===================================================================
--- main/plugin-survey/src/org/ametys/plugins/survey/actions/UpdateQuestionAction.java	(revision 45795)
+++ main/plugin-survey/src/org/ametys/plugins/survey/actions/UpdateQuestionAction.java	(working copy)
@@ -31,6 +31,7 @@
 import org.ametys.plugins.survey.SurveyEvents;
 import org.ametys.plugins.survey.repository.SurveyQuestion;
 import org.ametys.plugins.survey.repository.SurveyQuestion.QuestionType;
+import org.ametys.runtime.upload.Upload;
 
 /** 
  * This class creates a new question
@@ -56,6 +57,9 @@
         String options = request.getParameter("options");
         String columns = request.getParameter("columns");
         boolean otherOption = "true".equals(request.getParameter("other-option"));
+        String pictureId = request.getParameter("picture");
+        String pictureType = request.getParameter("picture#type");
+        String pictureAlternative = request.getParameter("picture-alternative");
         
         question.setLabel(label);
         question.setTitle(title);
@@ -63,6 +67,31 @@
         question.setType(QuestionType.valueOf(type));
         question.setRegExpType(regexp);
         
+        if (StringUtils.isEmpty(pictureId))
+        {
+            question.setNoPicture();
+        }
+        else if (pictureId.equals("untouched"))
+        {
+            // Do nothing.
+        }
+        else if (pictureType.equals("resource"))
+        {
+            question.setResourcePicture(pictureId);
+        }
+        else if (pictureType.equals("external"))
+        {
+            String login = _getCurrentUser();
+            Upload upload = _uploadManager.getUpload(login, pictureId);
+            
+            String filename = upload.getFilename();
+            String mimeType = upload.getMimeType() != null ? upload.getMimeType() : _context.getMimeType(filename);
+            String finalMimeType = mimeType != null ? mimeType : "application/unknown";
+            
+            question.setExternalPicture(finalMimeType, filename, upload.getInputStream());
+        }
+        question.setPictureAlternative(pictureAlternative);
+        
         if (StringUtils.isNotEmpty(options))
         {
             Map<String, String> opts = new LinkedHashMap<String, String>();
Index: main/plugin-survey/src/org/ametys/plugins/survey/actions/UpdateSurveyAction.java
===================================================================
--- main/plugin-survey/src/org/ametys/plugins/survey/actions/UpdateSurveyAction.java	(revision 45795)
+++ main/plugin-survey/src/org/ametys/plugins/survey/actions/UpdateSurveyAction.java	(working copy)
@@ -18,15 +18,24 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
 import org.apache.avalon.framework.parameters.Parameters;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.cocoon.Constants;
+import org.apache.cocoon.environment.Context;
 import org.apache.cocoon.environment.ObjectModelHelper;
 import org.apache.cocoon.environment.Redirector;
 import org.apache.cocoon.environment.Request;
 import org.apache.cocoon.environment.SourceResolver;
+import org.apache.commons.lang.StringUtils;
 
 import org.ametys.cms.observation.Event;
 import org.ametys.plugins.survey.SurveyEvents;
 import org.ametys.plugins.survey.repository.Survey;
+import org.ametys.runtime.upload.Upload;
+import org.ametys.runtime.upload.UploadManager;
 
 /** 
  * This class edits a survey
@@ -48,6 +57,9 @@
         String description = request.getParameter("description");
         String endingMessage = request.getParameter("endingMessage");
         String isPrivate = request.getParameter("private");
+        String pictureId = request.getParameter("picture");
+        String pictureType = request.getParameter("picture#type");
+        String pictureAlternative = request.getParameter("picture-alternative");
         
         Survey survey = _resolver.resolveById(surveyId);
         survey.setTitle(title);
@@ -56,6 +68,31 @@
         survey.setEndingMessage(endingMessage);
         survey.setPrivate("true".equals(isPrivate));
         
+        if (StringUtils.isEmpty(pictureId))
+        {
+            survey.setNoPicture();
+        }
+        else if (pictureId.equals("untouched"))
+        {
+            // Do nothing.
+        }
+        else if (pictureType.equals("resource"))
+        {
+            survey.setResourcePicture(pictureId);
+        }
+        else if (pictureType.equals("external"))
+        {
+            String login = _getCurrentUser();
+            Upload upload = _uploadManager.getUpload(login, pictureId);
+            
+            String filename = upload.getFilename();
+            String mimeType = upload.getMimeType() != null ? upload.getMimeType() : _context.getMimeType(filename);
+            String finalMimeType = mimeType != null ? mimeType : "application/unknown";
+            
+            survey.setExternalPicture(finalMimeType, filename, upload.getInputStream());
+        }
+        survey.setPictureAlternative(pictureAlternative);
+        
         survey.saveChanges();
         
         _observationManager.notify(new Event(_getCurrentUser(), SurveyEvents.SURVEY_MODIFIED, survey));
Index: main/plugin-survey/src/org/ametys/plugins/survey/generators/SurveyGenerator.java
===================================================================
--- main/plugin-survey/src/org/ametys/plugins/survey/generators/SurveyGenerator.java	(revision 45795)
+++ main/plugin-survey/src/org/ametys/plugins/survey/generators/SurveyGenerator.java	(working copy)
@@ -27,9 +27,13 @@
 import org.apache.cocoon.environment.Request;
 import org.apache.cocoon.xml.AttributesImpl;
 import org.apache.cocoon.xml.XMLUtils;
+import org.apache.commons.lang.StringUtils;
 import org.xml.sax.SAXException;
 
+import org.ametys.plugins.explorer.resources.Resource;
 import org.ametys.plugins.repository.AmetysObjectIterable;
+import org.ametys.plugins.repository.UnknownAmetysObjectException;
+import org.ametys.plugins.repository.metadata.BinaryMetadata;
 import org.ametys.plugins.survey.data.SurveyAnswerDao;
 import org.ametys.plugins.survey.repository.Survey;
 import org.ametys.plugins.survey.repository.SurveyPage;
@@ -88,6 +92,37 @@
         XMLUtils.createElement(contentHandler, "title", survey.getTitle());
         XMLUtils.createElement(contentHandler, "label", survey.getLabel());
         
+        AttributesImpl attrsPicture = new AttributesImpl();
+        String pictureType = survey.getPictureType();
+        attrsPicture.addCDATAAttribute("pictureType", pictureType);
+        if (pictureType.equals("resource"))
+        {
+            String resourceId = survey.getResourcePictureId();
+            attrsPicture.addCDATAAttribute("pictureId", resourceId);
+            try
+            {
+                Resource resource = _resolver.resolveById(resourceId);
+                attrsPicture.addCDATAAttribute("pictureName", resource.getName());
+                attrsPicture.addCDATAAttribute("pictureSize", Long.toString(resource.getLength()));
+                attrsPicture.addCDATAAttribute("imageType", "explorer");
+            }
+            catch (UnknownAmetysObjectException e)
+            {
+                getLogger().error("The resource of id'" + resourceId + "' does not exist anymore. The picture for survey of id '" + survey.getId() + "' will be ignored.", e);
+            }
+            
+        }
+        else if (pictureType.equals("external"))
+        {
+            BinaryMetadata picMeta = survey.getExternalPicture();
+            attrsPicture.addCDATAAttribute("picturePath", "picture");
+            attrsPicture.addCDATAAttribute("pictureName", picMeta.getFilename());
+            attrsPicture.addCDATAAttribute("pictureSize", Long.toString(picMeta.getLength()));
+            attrsPicture.addCDATAAttribute("imageType", "metadata");
+        }
+        XMLUtils.createElement(contentHandler, "picture", attrsPicture);
+        XMLUtils.createElement(contentHandler, "pictureAlternative", StringUtils.defaultString(survey.getPictureAlternative()));
+        
         if (startDate != null)
         {
             XMLUtils.createElement(contentHandler, "startDate", ParameterHelper.valueToString(startDate));
Index: main/plugin-survey/src/org/ametys/plugins/survey/generators/SurveysGenerator.java
===================================================================
--- main/plugin-survey/src/org/ametys/plugins/survey/generators/SurveysGenerator.java	(revision 45795)
+++ main/plugin-survey/src/org/ametys/plugins/survey/generators/SurveysGenerator.java	(working copy)
@@ -32,11 +32,14 @@
 import org.apache.commons.lang.StringUtils;
 import org.xml.sax.SAXException;
 
+import org.ametys.plugins.explorer.resources.Resource;
 import org.ametys.plugins.repository.AmetysObject;
 import org.ametys.plugins.repository.AmetysObjectIterable;
 import org.ametys.plugins.repository.AmetysObjectResolver;
 import org.ametys.plugins.repository.ModifiableTraversableAmetysObject;
+import org.ametys.plugins.repository.UnknownAmetysObjectException;
 import org.ametys.plugins.repository.jcr.JCRAmetysObject;
+import org.ametys.plugins.repository.metadata.BinaryMetadata;
 import org.ametys.plugins.survey.repository.Survey;
 import org.ametys.plugins.survey.repository.SurveyPage;
 import org.ametys.plugins.survey.repository.SurveyQuestion;
@@ -135,6 +138,37 @@
         XMLUtils.createElement(contentHandler, "title", survey.getTitle());
         XMLUtils.createElement(contentHandler, "label", survey.getLabel());
         
+        AttributesImpl attrsPicture = new AttributesImpl();
+        String pictureType = survey.getPictureType();
+        attrsPicture.addCDATAAttribute("pictureType", pictureType);
+        if (pictureType.equals("resource"))
+        {
+            String resourceId = survey.getResourcePictureId();
+            attrsPicture.addCDATAAttribute("pictureId", resourceId);
+            try
+            {
+                Resource resource = _resolver.resolveById(resourceId);
+                attrsPicture.addCDATAAttribute("pictureName", resource.getName());
+                attrsPicture.addCDATAAttribute("pictureSize", Long.toString(resource.getLength()));
+                attrsPicture.addCDATAAttribute("imageType", "explorer");
+            }
+            catch (UnknownAmetysObjectException e)
+            {
+                getLogger().error("The resource of id'" + resourceId + "' does not exist anymore. The picture for survey of id '" + survey.getId() + "' will be ignored.", e);
+            }
+            
+        }
+        else if (pictureType.equals("external"))
+        {
+            BinaryMetadata picMeta = survey.getExternalPicture();
+            attrsPicture.addCDATAAttribute("picturePath", "picture");
+            attrsPicture.addCDATAAttribute("pictureName", picMeta.getFilename());
+            attrsPicture.addCDATAAttribute("pictureSize", Long.toString(picMeta.getLength()));
+            attrsPicture.addCDATAAttribute("imageType", "metadata");
+        }
+        XMLUtils.createElement(contentHandler, "picture", attrsPicture);
+        XMLUtils.createElement(contentHandler, "pictureAlternative", StringUtils.defaultString(survey.getPictureAlternative()));
+        
         String description = survey.getDescription();
         if (description != null)
         {
@@ -177,6 +211,37 @@
         XMLUtils.createElement(contentHandler, "label", page.getLabel());
         XMLUtils.createElement(contentHandler, "description", page.getDescription());
         
+        AttributesImpl attrsPicture = new AttributesImpl();
+        String pictureType = page.getPictureType();
+        attrsPicture.addCDATAAttribute("pictureType", pictureType);
+        if (pictureType.equals("resource"))
+        {
+            String resourceId = page.getResourcePictureId();
+            attrsPicture.addCDATAAttribute("pictureId", resourceId);
+            try
+            {
+                Resource resource = _resolver.resolveById(resourceId);
+                attrsPicture.addCDATAAttribute("pictureName", resource.getName());
+                attrsPicture.addCDATAAttribute("pictureSize", Long.toString(resource.getLength()));
+                attrsPicture.addCDATAAttribute("imageType", "explorer");
+            }
+            catch (UnknownAmetysObjectException e)
+            {
+                getLogger().error("The resource of id'" + resourceId + "' does not exist anymore. The picture for page survey of id '" + page.getId() + "' will be ignored.", e);
+            }
+            
+        }
+        else if (pictureType.equals("external"))
+        {
+            BinaryMetadata picMeta = page.getExternalPicture();
+            attrsPicture.addCDATAAttribute("picturePath", "picture");
+            attrsPicture.addCDATAAttribute("pictureName", picMeta.getFilename());
+            attrsPicture.addCDATAAttribute("pictureSize", Long.toString(picMeta.getLength()));
+            attrsPicture.addCDATAAttribute("imageType", "metadata");
+        }
+        XMLUtils.createElement(contentHandler, "picture", attrsPicture);
+        XMLUtils.createElement(contentHandler, "pictureAlternative", StringUtils.defaultString(page.getPictureAlternative()));
+        
         if (saxChildren)
         {
             AmetysObjectIterable<SurveyQuestion> questions = page.getChildren();
@@ -258,6 +323,37 @@
         XMLUtils.createElement(contentHandler, "label", question.getLabel());
         XMLUtils.createElement(contentHandler, "title", question.getTitle());
         
+        AttributesImpl attrsPicture = new AttributesImpl();
+        String pictureType = question.getPictureType();
+        attrsPicture.addCDATAAttribute("pictureType", pictureType);
+        if (pictureType.equals("resource"))
+        {
+            String resourceId = question.getResourcePictureId();
+            attrsPicture.addCDATAAttribute("pictureId", resourceId);
+            try
+            {
+                Resource resource = _resolver.resolveById(resourceId);
+                attrsPicture.addCDATAAttribute("pictureName", resource.getName());
+                attrsPicture.addCDATAAttribute("pictureSize", Long.toString(resource.getLength()));
+                attrsPicture.addCDATAAttribute("imageType", "explorer");
+            }
+            catch (UnknownAmetysObjectException e)
+            {
+                getLogger().error("The resource of id'" + resourceId + "' does not exist anymore. The picture for question survey of id '" + question.getId() + "' will be ignored.", e);
+            }
+            
+        }
+        else if (pictureType.equals("external"))
+        {
+            BinaryMetadata picMeta = question.getExternalPicture();
+            attrsPicture.addCDATAAttribute("picturePath", "picture");
+            attrsPicture.addCDATAAttribute("pictureName", picMeta.getFilename());
+            attrsPicture.addCDATAAttribute("pictureSize", Long.toString(picMeta.getLength()));
+            attrsPicture.addCDATAAttribute("imageType", "metadata");
+        }
+        XMLUtils.createElement(contentHandler, "picture", attrsPicture);
+        XMLUtils.createElement(contentHandler, "pictureAlternative", StringUtils.defaultString(question.getPictureAlternative()));
+        
         String regExpType = question.getRegExpType();
         if (StringUtils.isNotEmpty(regExpType))
         {
Index: main/plugin-survey/src/org/ametys/plugins/survey/repository/Survey.java
===================================================================
--- main/plugin-survey/src/org/ametys/plugins/survey/repository/Survey.java	(revision 45795)
+++ main/plugin-survey/src/org/ametys/plugins/survey/repository/Survey.java	(working copy)
@@ -15,6 +15,7 @@
  */
 package org.ametys.plugins.survey.repository;
 
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
@@ -28,6 +29,8 @@
 import javax.jcr.RepositoryException;
 import javax.jcr.Value;
 
+import org.apache.commons.lang.StringUtils;
+
 import org.ametys.plugins.repository.AmetysObject;
 import org.ametys.plugins.repository.AmetysObjectIterable;
 import org.ametys.plugins.repository.AmetysRepositoryException;
@@ -36,6 +39,10 @@
 import org.ametys.plugins.repository.ModifiableTraversableAmetysObject;
 import org.ametys.plugins.repository.RepositoryConstants;
 import org.ametys.plugins.repository.jcr.DefaultTraversableAmetysObject;
+import org.ametys.plugins.repository.metadata.BinaryMetadata;
+import org.ametys.plugins.repository.metadata.ModifiableBinaryMetadata;
+import org.ametys.plugins.repository.metadata.ModifiableCompositeMetadata;
+import org.ametys.runtime.upload.Upload;
 import org.ametys.web.repository.SiteAwareAmetysObject;
 import org.ametys.web.repository.site.Site;
 
@@ -68,6 +75,14 @@
     private static final String __GRANTED_USERS = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":grantedUsers";
     /** Constants for granted users metadata. */
     private static final String __GRANTED_GROUPS = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":grantedGroups";
+    /** Constant for picture type metadata. */
+    private static final String __METADATA_PICTURE_TYPE = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":picture-type";
+    /** Constant for picture data metadata. */
+    private static final String __METADATA_PICTURE = "picture";
+    /** Constant for picture id metadata. */
+    private static final String __METADATA_PICTURE_ID = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":picture-id";
+    /** Constant for picture alternative metadata. */
+    private static final String __METADATA_PICTURE_ALTERNATIVE = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":picture-alternative";
     
     /**
      * Creates a {@link Survey}.
@@ -684,6 +699,192 @@
     }
     
     /**
+     * Get the picture as a binary metadata.
+     * @return the picture as a binary metadata.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public BinaryMetadata getExternalPicture() throws AmetysRepositoryException
+    {
+        return getMetadataHolder().getBinaryMetadata(__METADATA_PICTURE);
+    }
+    
+    /**
+     * Set the picture from an external file.
+     * @param mimeType the file MIME type.
+     * @param filename the file name.
+     * @param stream an input stream on the file bytes.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public void setExternalPicture(String mimeType, String filename, InputStream stream) throws AmetysRepositoryException
+    {
+        try
+        {
+            removePictureMetas();
+            
+            setPictureType("external");
+            
+            ModifiableCompositeMetadata meta = getMetadataHolder();
+            ModifiableBinaryMetadata pic = meta.getBinaryMetadata(__METADATA_PICTURE, true);
+            
+            pic.setLastModified(new Date());
+            pic.setInputStream(stream);
+            pic.setMimeType(mimeType);
+            pic.setFilename(filename);
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error setting the external picture property.", e);
+        }
+    }
+    
+    /**
+     * Get the picture resource ID.
+     * @return the resource ID.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public String getResourcePictureId() throws AmetysRepositoryException
+    {
+        try
+        {
+            return getNode().getProperty(__METADATA_PICTURE_ID).getString();
+        }
+        catch (PathNotFoundException e)
+        {
+            return null;
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error getting the picture ID property.", e);
+        }
+    }
+        
+    /**
+     * Set the picture from an explorer resource.
+     * @param resourceId the resource ID.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public void setResourcePicture(String resourceId) throws AmetysRepositoryException
+    {
+        try
+        {
+            removePictureMetas();
+            
+            setPictureType("resource");
+            
+            getNode().setProperty(__METADATA_PICTURE_ID, resourceId);
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error setting the alternative property.", e);
+        }
+    }
+    
+    /**
+     * Removes any picture currently assigned.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public void setNoPicture() throws AmetysRepositoryException
+    {
+        try
+        {
+            setPictureType("");
+            
+            removePictureMetas();
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error setting the alternative property.", e);
+        }
+    }
+
+    /**
+     * Get the picture type.
+     * @return the picture type.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public String getPictureType() throws AmetysRepositoryException
+    {
+        try
+        {
+            return getNode().getProperty(__METADATA_PICTURE_TYPE).getString();
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error getting the type property.", e);
+        }
+    }
+    
+    /**
+     * Set the picture type.
+     * @param type the picture type to set.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public void setPictureType(String type) throws AmetysRepositoryException
+    {
+        try
+        {
+            getNode().setProperty(__METADATA_PICTURE_TYPE, type);
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error setting the type property.", e);
+        }
+    }
+    
+    /**
+     * Get the picture alternative.
+     * @return the picture alternative.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public String getPictureAlternative() throws AmetysRepositoryException
+    {
+        try
+        {
+            return getNode().getProperty(__METADATA_PICTURE_ALTERNATIVE).getString();
+        }
+        catch (PathNotFoundException e)
+        {
+            return null;
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error getting the alternative property.", e);
+        }
+    }
+    
+    /**
+     * Set the picture alternative.
+     * @param alternative the picture alternative to set.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public void setPictureAlternative(String alternative) throws AmetysRepositoryException
+    {
+        try
+        {
+            getNode().setProperty(__METADATA_PICTURE_ALTERNATIVE, alternative);
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error setting the alternative property.", e);
+        }
+    }
+    
+    /**
+     * Remove all picture metas (picture ID and picture binary).
+     * @throws RepositoryException if an error occurs.
+     */
+    protected void removePictureMetas() throws RepositoryException
+    {
+        getNode().setProperty(__METADATA_PICTURE_ID, "");
+        
+        ModifiableCompositeMetadata meta = getMetadataHolder();
+        if (meta.hasMetadata(__METADATA_PICTURE))
+        {
+            meta.removeMetadata(__METADATA_PICTURE);
+        }
+    }
+    
+    /**
      * Returns a unique question name in the survey
      * @param originalName The original name
      * @return a unique question name
@@ -732,6 +933,35 @@
             survey.setEndingMessage(endingMessage);
         }
         
+        String pictureType = getPictureType();
+        if (StringUtils.isBlank(pictureType))
+        {
+            survey.setNoPicture();
+        }
+        else if (pictureType.equals("resource"))
+        {
+            String pictureId = getResourcePictureId();
+            if (StringUtils.isNotBlank(pictureId))
+            {
+                survey.setResourcePicture(pictureId);
+            }
+            else
+            {
+                survey.setNoPicture();
+            }
+        }
+        else if (pictureType.equals("external"))
+        {
+            BinaryMetadata externalPicture = getExternalPicture();
+            survey.setExternalPicture(externalPicture.getMimeType(), externalPicture.getFilename(), externalPicture.getInputStream());
+        }
+        
+        String pictureAlternative = getPictureAlternative();
+        if (pictureAlternative != null)
+        {
+            survey.setPictureAlternative(pictureAlternative);
+        }
+        
         survey.setPrivate(isPrivate());
         survey.setGrantedGroups(getGrantedGroups());
         survey.setGrantedUsers(getGrantedUsers());
Index: main/plugin-survey/src/org/ametys/plugins/survey/repository/SurveyPage.java
===================================================================
--- main/plugin-survey/src/org/ametys/plugins/survey/repository/SurveyPage.java	(revision 45795)
+++ main/plugin-survey/src/org/ametys/plugins/survey/repository/SurveyPage.java	(working copy)
@@ -15,12 +15,16 @@
  */
 package org.ametys.plugins.survey.repository;
 
+import java.io.InputStream;
+import java.util.Date;
 import java.util.List;
 
 import javax.jcr.Node;
 import javax.jcr.PathNotFoundException;
 import javax.jcr.RepositoryException;
 
+import org.apache.commons.lang.StringUtils;
+
 import org.ametys.plugins.repository.AmetysObject;
 import org.ametys.plugins.repository.AmetysObjectIterable;
 import org.ametys.plugins.repository.AmetysRepositoryException;
@@ -28,6 +32,9 @@
 import org.ametys.plugins.repository.ModifiableTraversableAmetysObject;
 import org.ametys.plugins.repository.RepositoryConstants;
 import org.ametys.plugins.repository.jcr.DefaultTraversableAmetysObject;
+import org.ametys.plugins.repository.metadata.BinaryMetadata;
+import org.ametys.plugins.repository.metadata.ModifiableBinaryMetadata;
+import org.ametys.plugins.repository.metadata.ModifiableCompositeMetadata;
 import org.ametys.plugins.survey.repository.SurveyRule.RuleType;
 
 /**
@@ -45,6 +52,14 @@
     private static final String __METADATA_RULE = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":rule";
     private static final String __METADATA_RULE_TYPE = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":rule";
     private static final String __METADATA_RULE_PAGE = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":page";
+    /** Constant for picture type metadata. */
+    private static final String __METADATA_PICTURE_TYPE = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":picture-type";
+    /** Constant for picture data metadata. */
+    private static final String __METADATA_PICTURE = "picture";
+    /** Constant for picture id metadata. */
+    private static final String __METADATA_PICTURE_ID = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":picture-id";
+    /** Constant for picture alternative metadata. */
+    private static final String __METADATA_PICTURE_ALTERNATIVE = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":picture-alternative";
     
     /**
      * Creates a {@link SurveyPage}.
@@ -309,6 +324,192 @@
         return getChildren();
     }
     
+    /**
+     * Get the picture as a binary metadata.
+     * @return the picture as a binary metadata.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public BinaryMetadata getExternalPicture() throws AmetysRepositoryException
+    {
+        return getMetadataHolder().getBinaryMetadata(__METADATA_PICTURE);
+    }
+    
+    /**
+     * Set the picture from an external file.
+     * @param mimeType the file MIME type.
+     * @param filename the file name.
+     * @param stream an input stream on the file bytes.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public void setExternalPicture(String mimeType, String filename, InputStream stream) throws AmetysRepositoryException
+    {
+        try
+        {
+            removePictureMetas();
+            
+            setPictureType("external");
+            
+            ModifiableCompositeMetadata meta = getMetadataHolder();
+            ModifiableBinaryMetadata pic = meta.getBinaryMetadata(__METADATA_PICTURE, true);
+            
+            pic.setLastModified(new Date());
+            pic.setInputStream(stream);
+            pic.setMimeType(mimeType);
+            pic.setFilename(filename);
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error setting the external picture property.", e);
+        }
+    }
+    
+    /**
+     * Get the picture resource ID.
+     * @return the resource ID.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public String getResourcePictureId() throws AmetysRepositoryException
+    {
+        try
+        {
+            return getNode().getProperty(__METADATA_PICTURE_ID).getString();
+        }
+        catch (PathNotFoundException e)
+        {
+            return null;
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error getting the picture ID property.", e);
+        }
+    }
+        
+    /**
+     * Set the picture from an explorer resource.
+     * @param resourceId the resource ID.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public void setResourcePicture(String resourceId) throws AmetysRepositoryException
+    {
+        try
+        {
+            removePictureMetas();
+            
+            setPictureType("resource");
+            
+            getNode().setProperty(__METADATA_PICTURE_ID, resourceId);
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error setting the alternative property.", e);
+        }
+    }
+    
+    /**
+     * Removes any picture currently assigned.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public void setNoPicture() throws AmetysRepositoryException
+    {
+        try
+        {
+            setPictureType("");
+            
+            removePictureMetas();
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error setting the alternative property.", e);
+        }
+    }
+
+    /**
+     * Get the picture type.
+     * @return the picture type.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public String getPictureType() throws AmetysRepositoryException
+    {
+        try
+        {
+            return getNode().getProperty(__METADATA_PICTURE_TYPE).getString();
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error getting the type property.", e);
+        }
+    }
+    
+    /**
+     * Set the picture type.
+     * @param type the picture type to set.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public void setPictureType(String type) throws AmetysRepositoryException
+    {
+        try
+        {
+            getNode().setProperty(__METADATA_PICTURE_TYPE, type);
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error setting the type property.", e);
+        }
+    }
+    
+    /**
+     * Get the picture alternative.
+     * @return the picture alternative.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public String getPictureAlternative() throws AmetysRepositoryException
+    {
+        try
+        {
+            return getNode().getProperty(__METADATA_PICTURE_ALTERNATIVE).getString();
+        }
+        catch (PathNotFoundException e)
+        {
+            return null;
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error getting the alternative property.", e);
+        }
+    }
+    
+    /**
+     * Set the picture alternative.
+     * @param alternative the picture alternative to set.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public void setPictureAlternative(String alternative) throws AmetysRepositoryException
+    {
+        try
+        {
+            getNode().setProperty(__METADATA_PICTURE_ALTERNATIVE, alternative);
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error setting the alternative property.", e);
+        }
+    }
+    
+    /**
+     * Remove all picture metas (picture ID and picture binary).
+     * @throws RepositoryException if an error occurs.
+     */
+    protected void removePictureMetas() throws RepositoryException
+    {
+        getNode().setProperty(__METADATA_PICTURE_ID, "");
+        
+        ModifiableCompositeMetadata meta = getMetadataHolder();
+        if (meta.hasMetadata(__METADATA_PICTURE))
+        {
+            meta.removeMetadata(__METADATA_PICTURE);
+        }
+    }
+    
     @Override
     public SurveyPage copyTo(ModifiableTraversableAmetysObject parent, String name) throws AmetysRepositoryException
     {
@@ -322,6 +523,35 @@
             page.setDescription(description);
         }
         
+        String pictureType = getPictureType();
+        if (StringUtils.isBlank(pictureType))
+        {
+            page.setNoPicture();
+        }
+        else if (pictureType.equals("resource"))
+        {
+            String pictureId = getResourcePictureId();
+            if (StringUtils.isNotBlank(pictureId))
+            {
+                page.setResourcePicture(pictureId);
+            }
+            else
+            {
+                page.setNoPicture();
+            }
+        }
+        else if (pictureType.equals("external"))
+        {
+            BinaryMetadata externalPicture = getExternalPicture();
+            page.setExternalPicture(externalPicture.getMimeType(), externalPicture.getFilename(), externalPicture.getInputStream());
+        }
+        
+        String pictureAlternative = getPictureAlternative();
+        if (pictureAlternative != null)
+        {
+            page.setPictureAlternative(pictureAlternative);
+        }
+        
         SurveyRule rule = getRule();
         if (rule != null)
         {
Index: main/plugin-survey/src/org/ametys/plugins/survey/repository/SurveyQuestion.java
===================================================================
--- main/plugin-survey/src/org/ametys/plugins/survey/repository/SurveyQuestion.java	(revision 45795)
+++ main/plugin-survey/src/org/ametys/plugins/survey/repository/SurveyQuestion.java	(working copy)
@@ -15,6 +15,8 @@
  */
 package org.ametys.plugins.survey.repository;
 
+import java.io.InputStream;
+import java.util.Date;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
@@ -33,6 +35,9 @@
 import org.ametys.plugins.repository.ModifiableTraversableAmetysObject;
 import org.ametys.plugins.repository.RepositoryConstants;
 import org.ametys.plugins.repository.jcr.DefaultTraversableAmetysObject;
+import org.ametys.plugins.repository.metadata.BinaryMetadata;
+import org.ametys.plugins.repository.metadata.ModifiableBinaryMetadata;
+import org.ametys.plugins.repository.metadata.ModifiableCompositeMetadata;
 import org.ametys.plugins.survey.repository.SurveyRule.RuleType;
 
 /**
@@ -65,6 +70,14 @@
     private static final String __METADATA_RULE_TYPE = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":rule";
     private static final String __METADATA_RULE_OPTION = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":option";
     private static final String __METADATA_RULE_PAGE = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":page";
+    /** Constant for picture type metadata. */
+    private static final String __METADATA_PICTURE_TYPE = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":picture-type";
+    /** Constant for picture data metadata. */
+    private static final String __METADATA_PICTURE = "picture";
+    /** Constant for picture id metadata. */
+    private static final String __METADATA_PICTURE_ID = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":picture-id";
+    /** Constant for picture alternative metadata. */
+    private static final String __METADATA_PICTURE_ALTERNATIVE = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":picture-alternative";
     
     /** Type of a page. */
     public enum QuestionType
@@ -616,6 +629,192 @@
         return getSurveyPage().getSurvey();
     }
     
+    /**
+     * Get the picture as a binary metadata.
+     * @return the picture as a binary metadata.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public BinaryMetadata getExternalPicture() throws AmetysRepositoryException
+    {
+        return getMetadataHolder().getBinaryMetadata(__METADATA_PICTURE);
+    }
+    
+    /**
+     * Set the picture from an external file.
+     * @param mimeType the file MIME type.
+     * @param filename the file name.
+     * @param stream an input stream on the file bytes.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public void setExternalPicture(String mimeType, String filename, InputStream stream) throws AmetysRepositoryException
+    {
+        try
+        {
+            removePictureMetas();
+            
+            setPictureType("external");
+            
+            ModifiableCompositeMetadata meta = getMetadataHolder();
+            ModifiableBinaryMetadata pic = meta.getBinaryMetadata(__METADATA_PICTURE, true);
+            
+            pic.setLastModified(new Date());
+            pic.setInputStream(stream);
+            pic.setMimeType(mimeType);
+            pic.setFilename(filename);
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error setting the external picture property.", e);
+        }
+    }
+    
+    /**
+     * Get the picture resource ID.
+     * @return the resource ID.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public String getResourcePictureId() throws AmetysRepositoryException
+    {
+        try
+        {
+            return getNode().getProperty(__METADATA_PICTURE_ID).getString();
+        }
+        catch (PathNotFoundException e)
+        {
+            return null;
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error getting the picture ID property.", e);
+        }
+    }
+        
+    /**
+     * Set the picture from an explorer resource.
+     * @param resourceId the resource ID.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public void setResourcePicture(String resourceId) throws AmetysRepositoryException
+    {
+        try
+        {
+            removePictureMetas();
+            
+            setPictureType("resource");
+            
+            getNode().setProperty(__METADATA_PICTURE_ID, resourceId);
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error setting the alternative property.", e);
+        }
+    }
+    
+    /**
+     * Removes any picture currently assigned.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public void setNoPicture() throws AmetysRepositoryException
+    {
+        try
+        {
+            setPictureType("");
+            
+            removePictureMetas();
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error setting the alternative property.", e);
+        }
+    }
+
+    /**
+     * Get the picture type.
+     * @return the picture type.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public String getPictureType() throws AmetysRepositoryException
+    {
+        try
+        {
+            return getNode().getProperty(__METADATA_PICTURE_TYPE).getString();
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error getting the type property.", e);
+        }
+    }
+    
+    /**
+     * Set the picture type.
+     * @param type the picture type to set.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public void setPictureType(String type) throws AmetysRepositoryException
+    {
+        try
+        {
+            getNode().setProperty(__METADATA_PICTURE_TYPE, type);
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error setting the type property.", e);
+        }
+    }
+    
+    /**
+     * Get the picture alternative.
+     * @return the picture alternative.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public String getPictureAlternative() throws AmetysRepositoryException
+    {
+        try
+        {
+            return getNode().getProperty(__METADATA_PICTURE_ALTERNATIVE).getString();
+        }
+        catch (PathNotFoundException e)
+        {
+            return null;
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error getting the alternative property.", e);
+        }
+    }
+    
+    /**
+     * Set the picture alternative.
+     * @param alternative the picture alternative to set.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public void setPictureAlternative(String alternative) throws AmetysRepositoryException
+    {
+        try
+        {
+            getNode().setProperty(__METADATA_PICTURE_ALTERNATIVE, alternative);
+        }
+        catch (RepositoryException e)
+        {
+            throw new AmetysRepositoryException("Error setting the alternative property.", e);
+        }
+    }
+    
+    /**
+     * Remove all picture metas (picture ID and picture binary).
+     * @throws RepositoryException if an error occurs.
+     */
+    protected void removePictureMetas() throws RepositoryException
+    {
+        getNode().setProperty(__METADATA_PICTURE_ID, "");
+        
+        ModifiableCompositeMetadata meta = getMetadataHolder();
+        if (meta.hasMetadata(__METADATA_PICTURE))
+        {
+            meta.removeMetadata(__METADATA_PICTURE);
+        }
+    }
+    
     @Override
     public SurveyQuestion copyTo(ModifiableTraversableAmetysObject parent, String name) throws AmetysRepositoryException
     {
@@ -625,6 +824,35 @@
         question.setMandatory(isMandatory());
         question.setType(getType());
         
+        String pictureType = getPictureType();
+        if (StringUtils.isBlank(pictureType))
+        {
+            question.setNoPicture();
+        }
+        else if (pictureType.equals("resource"))
+        {
+            String pictureId = getResourcePictureId();
+            if (StringUtils.isNotBlank(pictureId))
+            {
+                question.setResourcePicture(pictureId);
+            }
+            else
+            {
+                question.setNoPicture();
+            }
+        }
+        else if (pictureType.equals("external"))
+        {
+            BinaryMetadata externalPicture = getExternalPicture();
+            question.setExternalPicture(externalPicture.getMimeType(), externalPicture.getFilename(), externalPicture.getInputStream());
+        }
+        
+        String pictureAlternative = getPictureAlternative();
+        if (pictureAlternative != null)
+        {
+            question.setPictureAlternative(pictureAlternative);
+        }
+        
         String regExpType = getRegExpType();
         if (StringUtils.isNotEmpty(regExpType))
         {
Index: main/plugin-survey/stylesheets/survey2html.xsl
===================================================================
--- main/plugin-survey/stylesheets/survey2html.xsl	(revision 45795)
+++ main/plugin-survey/stylesheets/survey2html.xsl	(working copy)
@@ -18,7 +18,8 @@
 							  xmlns:math="java.lang.Math" 
                               xmlns:i18n="http://apache.org/cocoon/i18n/2.1"
                               xmlns:ametys="org.ametys.web.transformation.xslt.AmetysXSLTHelper"
-                              extension-element-prefixes="math ametys">
+                              xmlns:resolver="org.ametys.cms.transformation.xslt.ResolveURIComponent"
+                              extension-element-prefixes="math ametys resolver">
 
 	<xsl:import href="plugin:core://stylesheets/helper/text.xsl"/>
 	<xsl:import href="view://stylesheets/utils.xsl"/>
@@ -125,6 +126,16 @@
 
 	<xsl:template name="start-page">
 		<div class="start" id="survey-{$uniqueId}-start-page">
+			<xsl:call-template name="picture" >
+                <xsl:with-param name="class" select="'survey-picture'" />
+                <xsl:with-param name="imageType" select="survey/picture/@imageType" />
+                <xsl:with-param name="pictureType" select="survey/picture/@pictureType" />
+                <xsl:with-param name="pictureId" select="survey/picture/@pictureId" />
+                <xsl:with-param name="picturePath" select="survey/picture/@picturePath" />
+                <xsl:with-param name="pictureAlternative" select="survey/pictureAlternative" />
+                <xsl:with-param name="idObject" select="survey/@id" />
+            </xsl:call-template>  
+
 			<xsl:if test="survey/description != ''">
 				<p class="survey-hint">
 					<xsl:call-template name="text.nl2br">
@@ -220,6 +231,16 @@
 				</xsl:element>
 			</xsl:if>
 			
+			<xsl:call-template name="picture" >
+                <xsl:with-param name="class" select="'survey-page-picture'" />
+                <xsl:with-param name="imageType" select="picture/@imageType" />
+                <xsl:with-param name="pictureType" select="picture/@pictureType" />
+                <xsl:with-param name="pictureId" select="picture/@pictureId" />
+                <xsl:with-param name="picturePath" select="picture/@picturePath" />
+                <xsl:with-param name="pictureAlternative" select="pictureAlternative" />
+                <xsl:with-param name="idObject" select="@id" />
+            </xsl:call-template>  
+			
 			<xsl:if test="description != ''">
 				<p class="survey-page-hint">
 					<xsl:call-template name="text.nl2br">
@@ -320,6 +341,15 @@
 						<xsl:if test="@mandatory = 'true'"><span class="mandatory-marker"><xsl:text> </xsl:text><i18n:text i18n:key="PLUGINS_WEB_FRONTOFICE_MANDATORY_FIELD" i18n:catalogue="plugin.web"/></span></xsl:if>
 					</label>
 				</div>
+                <xsl:call-template name="picture" >
+                    <xsl:with-param name="class" select="'question-picture text-picture'" />
+                    <xsl:with-param name="imageType" select="picture/@imageType" />
+                    <xsl:with-param name="pictureType" select="picture/@pictureType" />
+                    <xsl:with-param name="pictureId" select="picture/@pictureId" />
+                    <xsl:with-param name="picturePath" select="picture/@picturePath" />
+                    <xsl:with-param name="pictureAlternative" select="pictureAlternative" />
+                    <xsl:with-param name="idObject" select="@id" />
+                </xsl:call-template>  	    
 				<div class="input">	
 					<input type="text" name="{@name}" id="{@name}_{$uniqueId}" class="text"/>
 				</div>
@@ -330,13 +360,22 @@
 	
 	<xsl:template match="question[@type = 'MULTILINE_FREE_TEXT']">
 		<div class="question" id="survey-{$uniqueId}-q-{@name}">
-			<div class="field">
+            <div class="field">
 				<div class="label">
 					<label for="{@name}_{$uniqueId}">
 						<span class="q">Q.<xsl:value-of select="count(preceding::question) + 1"/> - </span><xsl:value-of select="title"/>
 						<xsl:if test="@mandatory = 'true'"><span class="mandatory-marker"><xsl:text> </xsl:text><i18n:text i18n:key="PLUGINS_WEB_FRONTOFICE_MANDATORY_FIELD" i18n:catalogue="plugin.web"/></span></xsl:if>
 					</label>
 				</div>
+    			<xsl:call-template name="picture" >
+                    <xsl:with-param name="class" select="'question-picture textarea-picture'" />
+                    <xsl:with-param name="imageType" select="picture/@imageType" />
+                    <xsl:with-param name="pictureType" select="picture/@pictureType" />
+                    <xsl:with-param name="pictureId" select="picture/@pictureId" />
+                    <xsl:with-param name="picturePath" select="picture/@picturePath" />
+                    <xsl:with-param name="pictureAlternative" select="pictureAlternative" />
+                    <xsl:with-param name="idObject" select="@id" />
+                </xsl:call-template>           
 				<div class="input">	
 					<textarea name="{@name}" id="{@name}_{$uniqueId}" rows="3" cols="10"></textarea>
 				</div>
@@ -347,37 +386,49 @@
 	
 	<xsl:template match="question[@type = 'SINGLE_CHOICE']">
 		<div class="question" id="survey-{$uniqueId}-q-{@name}">
-			<fieldset>
+            <fieldset>
 				<legend>
 					<span class="q">Q.<xsl:value-of select="count(preceding::question) + 1"/> - </span><xsl:value-of select="title"/>
 					<xsl:if test="@mandatory = 'true'"><span class="mandatory-marker"><xsl:text> </xsl:text><i18n:text i18n:key="PLUGINS_WEB_FRONTOFICE_MANDATORY_FIELD" i18n:catalogue="plugin.web"/></span></xsl:if>
 				</legend>
 				
-				<xsl:variable name="name" select="@name"/>
-				<xsl:for-each select="options/option">
-					<div class="field">
-						<div class="input">
-							<input type="radio" id="{translate($name, ' ', '_')}_{@value}" name="{$name}" value="{@value}"/>
-						</div>
-						<div class="label">
-							<label for="{translate($name, ' ', '_')}_{@value}"><xsl:value-of select="."/></label>
-						</div>
-						<div class="field-end"/>
-					</div>
-				</xsl:for-each>
-				<xsl:if test="options/@other-option = 'true'">
-					<xsl:variable name="val">__internal_other</xsl:variable>
-					<div class="field">
-						<div class="input">
-							<input type="radio" id="{translate($name, ' ', '_')}_{$val}" name="{$name}" value="{$val}"/>
+				<xsl:call-template name="picture" >
+                    <xsl:with-param name="class" select="'question-picture single-choice-picture'" />
+                    <xsl:with-param name="imageType" select="picture/@imageType" />
+                    <xsl:with-param name="pictureType" select="picture/@pictureType" />
+                    <xsl:with-param name="pictureId" select="picture/@pictureId" />
+                    <xsl:with-param name="picturePath" select="picture/@picturePath" />
+                    <xsl:with-param name="pictureAlternative" select="pictureAlternative" />
+                    <xsl:with-param name="idObject" select="@id" />
+                </xsl:call-template>
+                   
+				<div class="fields">         
+					<xsl:variable name="name" select="@name"/>
+					<xsl:for-each select="options/option">
+						<div class="field">
+							<div class="input">
+								<input type="radio" id="{translate($name, ' ', '_')}_{@value}" name="{$name}" value="{@value}"/>
+							</div>
+							<div class="label">
+								<label for="{translate($name, ' ', '_')}_{@value}"><xsl:value-of select="."/></label>
+							</div>
+							<div class="field-end"/>
 						</div>
-						<div class="label">
-							<label for="{translate($name, ' ', '_')}_{$val}"><i18n:text i18n:key="PLUGINS_SURVEY_OTHER_OPTION"/></label>
-							<input type="text" name="__internal_other_{$name}" onkeyup="survey_otheropt_onkeyup(this, '{translate($name, ' ', '_')}_{$val}')"/>
+					</xsl:for-each>
+					<xsl:if test="options/@other-option = 'true'">
+						<xsl:variable name="val">__internal_other</xsl:variable>
+						<div class="field">
+							<div class="input">
+								<input type="radio" id="{translate($name, ' ', '_')}_{$val}" name="{$name}" value="{$val}"/>
+							</div>
+							<div class="label">
+								<label for="{translate($name, ' ', '_')}_{$val}"><i18n:text i18n:key="PLUGINS_SURVEY_OTHER_OPTION"/></label>
+								<input type="text" name="__internal_other_{$name}" onkeyup="survey_otheropt_onkeyup(this, '{translate($name, ' ', '_')}_{$val}')"/>
+							</div>
+							<div class="field-end"/>
 						</div>
-						<div class="field-end"/>
-					</div>
-				</xsl:if>
+					</xsl:if>
+				</div>
 			</fieldset>
 		</div>
 		
@@ -419,37 +470,49 @@
 	
 	<xsl:template match="question[@type = 'MULTIPLE_CHOICE']">
 		<div class="question" id="survey-{$uniqueId}-q-{@name}">
-			<fieldset>
+            <fieldset>
 				<legend>
 					<span class="q">Q.<xsl:value-of select="count(preceding::question) + 1"/> - </span><xsl:value-of select="title"/>
 					<xsl:if test="@mandatory = 'true'"><span class="mandatory-marker"><xsl:text> </xsl:text><i18n:text i18n:key="PLUGINS_WEB_FRONTOFICE_MANDATORY_FIELD" i18n:catalogue="plugin.web"/></span></xsl:if>
 				</legend>
 			
-				<xsl:variable name="name" select="@name"/>
-				<xsl:for-each select="options/option">
-					<div class="field">
-						<div class="input">
-							<input type="checkbox" name="{$name}" id="{translate($name, ' ', '_')}_{@value}" value="{@value}"/>
-						</div>
-						<div class="label">
-							<label for="{translate($name, ' ', '_')}_{@value}"><xsl:value-of select="."/></label>
-						</div>
-						<div class="field-end"/>
-					</div>
-				</xsl:for-each>
-				<xsl:if test="options/@other-option = 'true'">
-					<xsl:variable name="val">__internal_other</xsl:variable>
-					<div class="field">
-						<div class="input">
-							<input type="checkbox" id="{translate($name, ' ', '_')}_{$val}" name="{$name}" value="{$val}"/>
+			    <xsl:call-template name="picture" >
+                    <xsl:with-param name="class" select="'question-picture multiple-choice-picture'" />
+                    <xsl:with-param name="imageType" select="picture/@imageType" />
+                    <xsl:with-param name="pictureType" select="picture/@pictureType" />
+                    <xsl:with-param name="pictureId" select="picture/@pictureId" />
+                    <xsl:with-param name="picturePath" select="picture/@picturePath" />
+                    <xsl:with-param name="pictureAlternative" select="pictureAlternative" />
+                    <xsl:with-param name="idObject" select="@id" />
+                </xsl:call-template>
+                  
+                <div class="fields"> 
+					<xsl:variable name="name" select="@name"/>
+					<xsl:for-each select="options/option">
+						<div class="field">
+							<div class="input">
+								<input type="checkbox" name="{$name}" id="{translate($name, ' ', '_')}_{@value}" value="{@value}"/>
+							</div>
+							<div class="label">
+								<label for="{translate($name, ' ', '_')}_{@value}"><xsl:value-of select="."/></label>
+							</div>
+							<div class="field-end"/>
 						</div>
-						<div class="label">
-							<label for="{translate($name, ' ', '_')}_{$val}"><i18n:text i18n:key="PLUGINS_SURVEY_OTHER_OPTION"/></label>
-							<input type="text" name="__internal_other_{$name}" onkeyup="survey_otheropt_onkeyup(this, '{translate($name, ' ', '_')}_{$val}')"/>
+					</xsl:for-each>
+					<xsl:if test="options/@other-option = 'true'">
+						<xsl:variable name="val">__internal_other</xsl:variable>
+						<div class="field">
+							<div class="input">
+								<input type="checkbox" id="{translate($name, ' ', '_')}_{$val}" name="{$name}" value="{$val}"/>
+							</div>
+							<div class="label">
+								<label for="{translate($name, ' ', '_')}_{$val}"><i18n:text i18n:key="PLUGINS_SURVEY_OTHER_OPTION"/></label>
+								<input type="text" name="__internal_other_{$name}" onkeyup="survey_otheropt_onkeyup(this, '{translate($name, ' ', '_')}_{$val}')"/>
+							</div>
+							<div class="field-end"/>
 						</div>
-						<div class="field-end"/>
-					</div>
-				</xsl:if>
+					</xsl:if>
+			     </div>
 			</fieldset>
 		</div>
 		
@@ -493,14 +556,23 @@
 		<xsl:variable name="multiple" select="@type = 'MULTIPLE_MATRIX'"/>
 	
 		<div class="question" id="survey-{$uniqueId}-q-{@name}">
-			<fieldset>
+            <fieldset>
 				<legend>
 					<span class="q">Q.<xsl:value-of select="count(preceding::question) + 1"/> - </span><xsl:value-of select="title"/>
 					<xsl:if test="@mandatory = 'true'"><span class="mandatory-marker"><xsl:text> </xsl:text><i18n:text i18n:key="PLUGINS_WEB_FRONTOFICE_MANDATORY_FIELD" i18n:catalogue="plugin.web"/></span></xsl:if>
 				</legend>
 				
+				<xsl:call-template name="picture" >
+				    <xsl:with-param name="class" select="'question-picture matrix-picture'" />
+                    <xsl:with-param name="imageType" select="picture/@imageType" />
+				    <xsl:with-param name="pictureType" select="picture/@pictureType" />
+				    <xsl:with-param name="pictureId" select="picture/@pictureId" />
+                    <xsl:with-param name="picturePath" select="picture/@picturePath" />
+                    <xsl:with-param name="pictureAlternative" select="pictureAlternative" />
+                    <xsl:with-param name="idObject" select="@id" />
+                </xsl:call-template>
+                
 				<xsl:variable name="name" select="@name"/>
-				
 				<div class="field">
 
 					<table>
@@ -599,4 +671,32 @@
 			errors.push({label: "<xsl:value-of select="title"/>", message: msg});
 		}
 	</xsl:template>
+	
+	<xsl:template name="picture">
+	   <xsl:param name="class" />
+       <xsl:param name="imageType" />
+	   <xsl:param name="pictureType" />
+	   <xsl:param name="pictureId" />
+       <xsl:param name="picturePath" />
+       <xsl:param name="pictureAlternative" />
+       <xsl:param name="idObject" />
+       <xsl:if test="$pictureType != ''">
+            <div class="{$class}">
+                <xsl:variable name="id">
+                    <xsl:choose>
+                        <xsl:when test="$pictureType = 'resource'">
+                            <xsl:value-of select="$pictureId"/>
+                        </xsl:when>
+                        <xsl:when test="$pictureType = 'external'">
+                            <xsl:value-of select="concat($picturePath, '?objectId=', $idObject)"/>
+                        </xsl:when>
+                    </xsl:choose>
+                </xsl:variable>
+                <img src="{resolver:resolveBoundedImage($imageType, $id, 100, 100)}">
+                    <xsl:attribute name="alt"><xsl:value-of select="$pictureAlternative"/></xsl:attribute>
+                </img>
+            </div>
+        </xsl:if>
+	</xsl:template>
+	
 </xsl:stylesheet>
